package com.lzh.o2o.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.lzh.o2o.dao.ProductDao;
import com.lzh.o2o.dao.ProductImgDao;
import com.lzh.o2o.dto.ImageHolder;
import com.lzh.o2o.dto.ProductExecution;
import com.lzh.o2o.enums.ProductStateEnum;
import com.lzh.o2o.exception.ProductOperationException;
import com.lzh.o2o.pojo.Product;
import com.lzh.o2o.pojo.ProductImg;
import com.lzh.o2o.service.ProductService;
import com.lzh.o2o.util.ImageUtil;
import com.lzh.o2o.util.PageCalculator;
import com.lzh.o2o.util.PathUtil;

/** 
* @author  haohao: 
* @date 创建时间：2018年9月17日 上午11:56:58 
* @version 1.0 
* @parameter 
* @since  
* @return  
*/
@Service
public class ProductServiceImpl implements ProductService {

	@Autowired
	private ProductDao productDao;
	@Autowired
	private ProductImgDao productImgDao;
	
	//1处理缩略图，获取缩略图相对路径并赋值给product
	//2往tb_product写入商品信息，获取productId
	//3结合productId批量处理商铺详情图
	//4将商品详情图列表批量插入tb_product_img中
	@Override
	@Transactional
	public ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList)
			throws ProductOperationException {
		//空值判断
		if(product !=null&&product.getShop()!=null&&product.getShop().getShopId()!=null){
			//给商品设置上默认属性
			product.setCreateTime(new Date());
			product.setLastEditTime(new Date());
			//默认为上架的状态
			product.setEnableStatus(1);
			//若商品缩略图不为空则添加
			if(thumbnail!=null){
				addThumbnail(product,thumbnail);
			}
			try{
				//创建商品信息
				int effectedNum = productDao.insertProduct(product);
				if(effectedNum<=0){
					throw new ProductOperationException("创建商品失败");
				}
			}catch(Exception e){
				throw new ProductOperationException("创建商品失败"+e.toString());
			}
			//若商品详情图不为空则添加
			if(productImgList!=null&&productImgList.size()>0){
				addProductImgList(product,productImgList);
			}
			return new ProductExecution(ProductStateEnum.SUCCESS,product);
		}else{
			//传参数为空返回空值错误信息
			return new ProductExecution(ProductStateEnum.EMPTY);

		}
		
	}


	//处理缩略图
	private void addThumbnail(Product product, ImageHolder thumbnail) {
		String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
		String thumbnailAddr = ImageUtil.generateThumbnail(thumbnail, dest);
		//获取相对路径
		product.setImgAddr(thumbnailAddr);
		
	}
	private void addProductImgList(Product product, List<ImageHolder> productImgHolderList) {
		//获取图片存储路径，这里直接存放到相应店铺的文件夹底下
		String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
		List<ProductImg> productImgList = new ArrayList<ProductImg>();
		//遍历图片一次去处理，并添加到ProducImg实体类里
		for(ImageHolder p:productImgHolderList){
			//调用的是商品详情图的创建缩略图方法
			String imgAddr = ImageUtil.generateNormalImg(p, dest);
			ProductImg productImg = new ProductImg();
			productImg.setImgAddr(imgAddr);
			productImg.setProductId(product.getProductId());
			productImg.setCreateTime(new Date());
			productImgList.add(productImg);
		}
		//判断是否有图片需要添加，执行批量添加操作
		if(productImgList.size()>0){
			try{
				int effectedNum = productImgDao.batchInsertProductImg(productImgList);
				if(effectedNum<=0){
					throw new ProductOperationException("创建商品详情图片失败");
				}
			}catch(Exception e){
				throw new ProductOperationException("创建商品详情图片失败"+e.toString());

			}
		}
	}

	//返回dao层查询到的数据
	@Override
	public Product getProductById(Long productId) throws ProductOperationException {
		// TODO Auto-generated method stub
		return productDao.queryProductById(productId);
	}


	@Override
	@Transactional
	//1.处理缩略图，获取缩略图相对路径并赋值给Product
	//2.往tb_product写入商品信息，获取productId
	//3.结合productId批量处理商铺详情图
	//4.将商品详情图列表批量插入到tb_product_img中
	public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList)
			throws ProductOperationException {
		//空值判断
		if(product!=null&&product.getShop()!=null&&product.getShop().getShopId()!=null){
			//给商品设置上默认属性
			product.setLastEditTime(new Date());
			//若商品缩略图不为空且原有缩略图不为空则删除原有缩略图并添加
			if(thumbnail!=null){
				//获取一遍对应Id原有的信息，原有信息有原图片信息地址
				Product tempProduct = productDao.queryProductById(product.getProductId());
				if(tempProduct.getImgAddr()!=null){
					ImageUtil.deleteFilePath(tempProduct.getImgAddr());

				}
				addThumbnail(product,thumbnail);
			}
			//如果有新存入的商品详情图，则将原先的删除，并添加新的图片
			if(productImgList!=null&&productImgList.size()>0){
				deleteProductImgList(product.getProductId());
				addProductImgList(product,productImgList);
			}
			try{
				//更新商品信息
				int effectedNum = productDao.updateProduct(product);
				if(effectedNum<=0){
					throw new ProductOperationException("更新商品信息失败");
				}
				return new ProductExecution(ProductStateEnum.SUCCESS,product);
			}catch(ProductOperationException e){
				throw new ProductOperationException("更新商品信息失败:"+e.toString());
			}
			
		}else{
			return new ProductExecution(ProductStateEnum.EMPTY);
		}
	}

	//删除某个商品下的所有详情图
	private void deleteProductImgList(Long productId) {
		//根据productId获取原来的图片
		List<ProductImg> productImgList = productImgDao.queryProductImgList(productId);
		//删除原来在目录下的图片
		for (ProductImg productImg : productImgList) {
			ImageUtil.deleteFilePath(productImg.getImgAddr());
		}
		
		//删除数据库原有的图片信息
		productImgDao.deleteProductImgByProductId(productId);
	}


	//分页显示查询商品列表
	@Override
	public ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize) {
		//页码转换成数据库的行码，并调用dao层取回指定页码的商品列表
		int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
		List<Product> productList = productDao.queryProuctList(productCondition, rowIndex, pageSize);
		//基于相同查询条件下的商品总数
		int count = productDao.queryProductCount(productCondition);
		ProductExecution pe = new ProductExecution();
		pe.setProductList(productList);
		pe.setCount(count);
		return pe;
	}

}
